import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken, TokenKey } from '@/utils/auth'
import router from '@/router'

// 创建一个新的axios实例
const service = axios.create({
  // 注意点当我们执行 npm run dev 这个命令时:VUE_APP_BASE_API的值是 .env.developent这个文件的值
  // 当我们执行 npm run build:prod 这个命令时:VUE_APP_BASE_API的值是 .env.production这个文件的值
  baseURL: process.env.VUE_APP_BASE_API, // 基础地址
  timeout: 10000 // 请求超时时间 10秒
})

// 请求拦截器
service.interceptors.request.use(
  // 成功执行
  config => {
    // 请求之前需要做哪些事情
    if (store.getters.token) {
      config.headers[TokenKey] = getToken()
    }
    return config
  },
  // 失败执行
  error => {
    // 处理请求失败
    // console.log(error) // for debug
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    // 如果返回的是业务状态码code==2000,则为成功
    if (res.code !== 2000) {
      Message({
        message: res.msg || 'Error',
        type: 'error',
        duration: 5 * 1000
      })
      // 返回一个Promise.reject对象，业务返回的异常,会自动返回我们后台返回的错误信息，前端不需要自己写
      return Promise.reject(new Error(res.msg || 'Error'))
    } else {
      // code===2000 代表成功，这里先去掉一层皮
      return res.data
    }
  },
  error => {
    if (error.response) {
      // 请求已发出，但服务器响应的状态码不在 2xx 范围内
      if (error.response.status === 401) {
        // 清空后台缓存中的用户信息
        store.dispatch('user/clearVuex')
        MessageBox.confirm('身份已失效,请重新登录', '提示信息', {
          confirmButtonText: '确定',
          cancelButtonText: '取消', // 可选，如果不需要取消按钮可以去掉
          type: 'error'
        })
          .then(() => {
            router.push('/login')
          })
          .catch(() => {
            router.push('/login')
          })
        return Promise.reject(error)
      } else if (error.response.status === 403) {
        // 权限不足
        Message({
          message: '权限不足',
          type: 'error',
          duration: 5 * 1000
        })
        return Promise.reject(error)
      } else {
        // 其他错误
        Message({
          message: '服务器系统异常',
          type: 'error',
          duration: 5 * 1000
        })
        return Promise.reject(error)
      }
    } else {
      if (error.response) {
        // 处理请求未发出或者网络错误等情况
        Message({
          message: '无法连接到服务器，请检查您的网络连接',
          type: 'error',
          duration: 5 * 1000
        })
      }
    }
    return Promise.reject(error)
  }
)
// 默认导出我们的axios实例
export default service
